/*
 * Copyright (C) 2025 Square, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package app.cash.redwood.buildsupport

import okio.FileSystem
import okio.Path.Companion.toOkioPath
import okio.Path.Companion.toPath
import org.gradle.api.DefaultTask
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.TaskAction

/**
 * Write snapshot-testing.js to the current project's karma.config.d directory. (Unfortunately
 * there's no API to tell Karma to load extensions from a build directory.)
 */
internal abstract class WriteSnapshotTestingJsTask : DefaultTask() {
  @get:OutputDirectory
  abstract val karmaConfigD: DirectoryProperty

  @TaskAction
  fun task() {
    val sourcePath = "/app/cash/redwood/buildsupport/generated-redwood-snapshot-testing.js".toPath()
    val targetPath = karmaConfigD.file("generated-redwood-snapshot-testing.js")
      .get().asFile.toOkioPath()

    FileSystem.SYSTEM.createDirectories(targetPath.parent!!)
    FileSystem.SYSTEM.write(targetPath) {
      writeUtf8(
        """
        |// DO NOT EDIT.
        |//
        |// This file is generated by the Redwood Gradle plugin. You may ignore it
        |// by adding this line to your .gitignore:
        |//
        |// generated-redwood-snapshot-testing.js
        |//
        |
        """.trimMargin(),
      )
      FileSystem.RESOURCES.source(sourcePath).use {
        writeAll(it)
      }
    }
  }
}
